package com.xiangty.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import com.xiangty.bean.User;
import com.xiangty.bean.UserContact;
import com.xiangty.bean.UserContactAndUser;

public interface UserMapper {

	/**
	 * 根据id查询用户信息
	 * @param id
	 * @return
	 */
	User getUserById(Integer id);
	
	/**
	 * 根据username查询用户信息
	 * @param username
	 * @return
	 */
	User getUserByUsername(String username);
	
	/**
	 * 根据userid查询用户联系信息,这是输出userContact信息
	 * @param userid
	 * @return
	 */
	UserContact getUserContactByUserId(Integer userid);
	
	
	/**
	 * 根据id既要返回userContact信息还要返回user信息 方法一：创建新的实体类
	 * @param id
	 * @return
	 */
	UserContactAndUser getUserContactAndUserById(Integer id);
	
	/**
	 * 根据id既要返回userContact信息还要返回user信息 方法二：使用resultMap
	 * @param id
	 * @return
	 */
	UserContact getUserContactAndUserById2(Integer id);
	
	/**
	 * 新增用户
	 * @param user
	 * @return
	 */
	int insert(User user);
	
	/**
	 * 新增用户-使用useGeneratedKeys方式
	 * @param user
	 * @return
	 */
	int insert2(User user);
	
	/**
	 * 新增用户-使用selectKye方式
	 * @param user
	 * @return
	 */
	int insert3(User user);
	
	/**
	 * 根据主键更新
	 * @param user
	 * @return
	 */
	int updateById(User user);
	
	/**
	 * 通过username模糊删除
	 * @param user
	 * @return
	 */
	int deleteByUsername(User user);
	
	/**
	 * 根据用户和密码查询用户
	 * @param username
	 * @param password
	 * @return
	 */
	List<User> selectUserByUsernameAndPassword(@Param(value="username") String username,@Param(value="password") String password);
	
	/**
	 * 根据用户和密码查询用户-参数以map的参数形式
	 * @param paramterMap
	 * @return
	 */
	List<User> selectUserByUsernameAndPassword2(Map<String, String> paramterMap);
	
	/**
	 * 使用Select注解根据id查询
	 * @param id
	 * @return
	 */
	@Select({"SELECT id, username, password FROM user WHERE id = #{id}"})
	User selectById(int id);
	
	
	/**
	 * 根据id既要返回userContact信息，方法一：mapUnderscoreCamelCase驼峰命名配置
	 * @param id
	 * @return
	 */
	@Select({"SELECT id, email, phone, home_address, user_id FROM user_contact"})
	List<UserContact> selectUserContact();
	
	
	
	/****************  动态SQL ********************/
	List<User> selectByUser(User user);
	
	
	/**
	 * 根据主键更新
	 * @param user
	 * @return
	 */
	int updateByIdSelective(User user);
	
	/**
	 * 新增
	 * @param user
	 * @return
	 */
	int insert4(User user);
	
	User selectByIdOrUsername(User user);
	
	/**
	 * 根据id集合查询
	 * @param idList
	 * @return
	 */
	List<User> selectByIdList(List<Integer> idList);
	
	/**
	 * 批量新增用户
	 * @param userList
	 * @return
	 */
	int insertList(List<User> userList);
	
	/**
	 * 通过Map更新列
	 * @param map
	 * @return
	 */
	int updateByMap(Map<String, Object> map);
	
	
	
	
}
